home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / crayola / common / crayPolylist.c < prev    next >
C/C++ Source or Header  |  1993-01-12  |  6KB  |  200 lines

  1. #include <stdio.h>
  2. #include "geom.h"
  3. #include "polylistP.h"
  4. #include "crayolaP.h"
  5.  
  6. void *cray_polylist_HasColor(int sel, Geom *geom, va_list args);
  7. void *cray_polylist_HasVColor(int sel, Geom *geom, va_list args);
  8. void *cray_polylist_HasFColor(int sel, Geom *geom, va_list args);
  9.  
  10. void *cray_polylist_UseVColor(int sel, Geom *geom, va_list args);
  11. void *cray_polylist_UseFColor(int sel, Geom *geom, va_list args);
  12.  
  13. void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list args);
  14.  
  15. void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list args);
  16. void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list args);
  17. void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list args);
  18. void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list args);
  19.  
  20. void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list args);
  21. void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list args);
  22. void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list args);
  23.  
  24. #define MAX_METHODS 15
  25.  
  26. static craySpecFunc methods[] = {
  27.   "crayHasColor", cray_polylist_HasColor,
  28.   "crayHasVColor", cray_polylist_HasVColor,
  29.   "crayHasFColor", cray_polylist_HasFColor,
  30.  
  31.   "crayCanUseVColor", crayTrue,
  32.   "crayCanUseFColor", crayTrue,
  33.  
  34.   "crayUseVColor", cray_polylist_UseVColor,
  35.   "crayUseFColor", cray_polylist_UseFColor,
  36.  
  37.   "crayEliminateColor", cray_polylist_EliminateColor,
  38.  
  39.   "craySetColorAll", cray_polylist_SetColorAll,
  40.   "craySetColorAt", cray_polylist_SetColorAt,
  41.   "craySetColorAtV", cray_polylist_SetColorAtV,
  42.   "craySetColorAtF", cray_polylist_SetColorAtF,
  43.  
  44.   "crayGetColorAt", cray_polylist_GetColorAt,
  45.   "crayGetColorAtV", cray_polylist_GetColorAtV,
  46.   "crayGetColorAtF", cray_polylist_GetColorAtF
  47.   };
  48.  
  49. cray_polylist_init() {
  50.   crayInitSpec(methods, MAX_METHODS, GeomClassLookup("polylist"));
  51.   return 0;
  52. }
  53.  
  54. void *cray_polylist_HasColor(int sel, Geom *geom, va_list args) {
  55.   return (void *)(crayHasVColor(geom, NULL) || crayHasFColor(geom, NULL));
  56. }
  57.  
  58. void *cray_polylist_HasVColor(int sel, Geom *geom, va_list args) {
  59.   PolyList *p = (PolyList *)geom;
  60.   return (void *)(p->flags & PL_HASVCOL);
  61. }
  62.  
  63. void *cray_polylist_HasFColor(int sel, Geom *geom, va_list args) {
  64.   PolyList *p = (PolyList *)geom;
  65.   return (void *)(p->flags & PL_HASPCOL);
  66. }
  67.  
  68. void *cray_polylist_UseVColor(int sel, Geom *geom, va_list args) {
  69.   PolyList *p = (PolyList *)geom;
  70.   ColorA *def;
  71.   int i, j;
  72.  
  73.   def = va_arg(args, ColorA *);
  74.   for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *def;
  75.  
  76.   if (p->flags & PL_HASPCOL) {
  77.     for (i = 0; i < p->n_polys; i++) 
  78.       for (j = 0; j < p->p[i].n_vertices; j++) 
  79.     p->p[i].v[j]->vcol = p->p[i].pcol;
  80.     p->flags ^= PL_HASPCOL;
  81.   }
  82.  
  83.   p->flags |= PL_HASVCOL;
  84.   return (void *)p;
  85. }
  86.  
  87. void *cray_polylist_UseFColor(int sel, Geom *geom, va_list args) {
  88.   PolyList *p = (PolyList *)geom;
  89.   ColorA *def;
  90.   int i;
  91.  
  92.   def = va_arg(args, ColorA *);
  93.   for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *def;
  94.   if (p->flags & PL_HASVCOL) {
  95.     for (i = 0; i < p->n_polys; i++) 
  96.       if (p->p[i].n_vertices) p->p[i].pcol = p->p[i].v[0]->vcol;
  97.     p->flags ^= PL_HASVCOL;
  98.   }
  99.  
  100.   p->flags |= PL_HASPCOL;
  101.   return (void *)p;
  102. }
  103.  
  104. void *cray_polylist_EliminateColor(int sel, Geom *geom, va_list args) {
  105.   PolyList *p = (PolyList *)geom;
  106.   if (!crayHasColor(geom, NULL)) return 0;
  107.   p->flags &= ~PL_HASVCOL;
  108.   p->flags &= ~PL_HASPCOL;
  109.   return (void *)p;
  110. }
  111.  
  112. void *cray_polylist_SetColorAll(int sel, Geom *geom, va_list args) {
  113.   int i;
  114.   PolyList *p = (PolyList *)geom;
  115.   ColorA *color = va_arg(args, ColorA *);
  116.  
  117.   for (i = 0; i < p->n_verts; i++) p->vl[i].vcol = *color;
  118.   for (i = 0; i < p->n_polys; i++) p->p[i].pcol = *color;
  119.   return (void *)crayHasColor(geom, NULL);
  120. }
  121.  
  122. void *cray_polylist_SetColorAt(int sel, Geom *geom, va_list args) {
  123.   ColorA *color;
  124.   int vindex, findex;
  125.   color = va_arg(args, ColorA *);
  126.   vindex = va_arg(args, int);
  127.   findex = va_arg(args, int);
  128.   if (crayHasVColor(geom, NULL) && vindex != -1) 
  129.     return (void *)craySetColorAtV(geom, color, vindex, NULL, NULL);
  130.   return (void *)craySetColorAtF(geom, color, findex, NULL);
  131. }
  132.  
  133. void *cray_polylist_SetColorAtV(int sel, Geom *geom, va_list args) {
  134.   PolyList *p = (PolyList *)geom;
  135.   ColorA *color;
  136.   int index;
  137.  
  138.   color = va_arg(args, ColorA *);
  139.   index = va_arg(args, int);
  140.   if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0;
  141.   p->vl[index].vcol = *color;
  142.   return (void *)geom;
  143. }
  144.  
  145. void *cray_polylist_SetColorAtF(int sel, Geom *geom, va_list args) {
  146.   int i;
  147.   PolyList *p = (PolyList *)geom;
  148.   ColorA *color;
  149.   int index;
  150.  
  151.   color = va_arg(args, ColorA *);
  152.   index = va_arg(args, int);
  153.   if (index == -1) return (void *)0;
  154.   if (crayHasFColor(geom, NULL)) p->p[index].pcol = *color;
  155.   else if (crayHasVColor(geom, NULL)) 
  156.     for (i = 0; i < p->p[index].n_vertices; i++)
  157.       p->p[index].v[i]->vcol = *color;
  158.   return (void *)geom;
  159. }
  160.  
  161. void *cray_polylist_GetColorAt(int sel, Geom *geom, va_list args) {
  162.   PolyList *polylist = (PolyList *)geom;
  163.   ColorA *color;
  164.   int vindex, findex;
  165.  
  166.   color = va_arg(args, ColorA *);
  167.   vindex = va_arg(args, int);
  168.   findex = va_arg(args, int);
  169.   if (crayHasVColor(geom, NULL))
  170.     return (void *)crayGetColorAtV(geom, color, vindex, NULL, NULL);
  171.   if (crayHasFColor(geom, NULL))
  172.     return (void *)crayGetColorAtF(geom, color, findex, NULL);
  173.   return NULL;
  174. }
  175.  
  176. void *cray_polylist_GetColorAtV(int sel, Geom *geom, va_list args) {
  177.   PolyList *p = (PolyList *)geom;
  178.   ColorA *color;
  179.   int index;
  180.   
  181.   color = va_arg(args, ColorA *);
  182.   index = va_arg(args, int);
  183.   if (!crayHasVColor(geom, NULL) || index == -1) return (void *)0;
  184.   *color = p->vl[index].vcol;
  185.   return (void *)geom;
  186. }
  187.  
  188. void *cray_polylist_GetColorAtF(int sel, Geom *geom, va_list args) {
  189.   PolyList *p = (PolyList *)geom;
  190.   ColorA *color;
  191.   int index;
  192.   
  193.   color = va_arg(args, ColorA *);
  194.   index = va_arg(args, int);
  195.   if (!crayHasFColor(geom, NULL) || index == -1) return (void *)0;
  196.   *color = p->p[index].pcol;
  197.   return (void *)geom;
  198. }
  199.      
  200.